
#ifndef GAMECONTROL_H
#define GAMECONTROL_H

#include "musicscore.h"
#include "gamedefine.h"
#include "widget.h"


class GameControl:public QObject
{
    GameControl();//单例
    static GameControl* instance;
public:
    static GameControl* Instance();//创建单例
    ~GameControl();//析构函数

    //游戏初始化
    void setParent(Widget* Parent);//设置父亲指针
    void GameInit();

    void LoadMS();//获取谱面

    //开始界面
    void LoadStartScene();//初始化开始界面
    void LoadStartPos();//初始化各元素位置
    void LoadStartAddItem();//初始化添加元素至场景
    void LoadStartAddPicture();//添加初始背景元素图片
    void LoadStartPushbutton();//按钮初始化

    //主界面
    void LoadMainScene();//初始化主要界面
    void LoadMainAddItem();//初始化添加元素至场景
    void LoadMainAddPicture();//添加主要背景元素图片
    void LoadMainAddEffect();//添加主要背景效果
    void LoadMainSettingItems();//新建各元素
    void LoadMainPos();//初始化各元素位置
    void LoadMainPushButton();//按钮初始化

    //结算界面
    void LoadEndScene();//初始化结算界面
    void LoadEndBGM();//初始化结算界面的BGM
    void LoadEndAddItem();//初始化添加元素至场景
    void LoadEndAddEffect();//添加主要背景效果
    void LoadEndAddPicture();//添加主要背景元素图片
    void LoadEndPos();//初始化各元素位置

    //计时器
    void CreateTimer();//创建计时器
    void TimerConnect();//计时器连接


    //其他函数
    void judgeStatus();//判断状态PGBM
    void ShowStatus();//显示状态PGBM
    void ShowComboNum();//显示连击数
    void ShowPoints();//显示分数
    void ResetEnddata();//在进入最终结算界面前重载数据

    //暂停界面
    void LoadStopScene();//加载暂停场景
    void Stop();
    void GameContinue();//继续游戏
    void LoadStopPicture();//给暂停场景元素添加图片
    void LoadStopSettingItems();//新建各元素
    void LoadStopPushButton();//初始化暂停场景中按钮
    void LoadStopPos();//初始化各元素位置
    void LoadStopAddItem();//初始化添加元素至场景
    void LoadStopAddEffect();//添加暂停背景效果
    void StopButtonConnect();


    QPushButton *EndReset;//结束界面的Reset按钮

    QPushButton *Quit;//退出按钮
protected:
    MusicScore *mMS;//谱面

    Widget* parent;//场景的父亲指针

    QGraphicsView mGameView;//游戏主视图

    QGraphicsScene mStartScene;//游戏开始场景
    QGraphicsScene mMainScene; //游戏主场景
    QGraphicsScene mEndScene;//结算场景
    QGraphicsScene mStopScene;//结束场景

    QGraphicsPixmapItem mBackground;//游戏背景
    QGraphicsPixmapItem mTrack1;//设置四个轨道
    QGraphicsPixmapItem mTrack2;
    QGraphicsPixmapItem mTrack3;
    QGraphicsPixmapItem mTrack4;
    QGraphicsPixmapItem mStartBackground;//开始界面背景
    QGraphicsPixmapItem mTitle1;//标题
    QGraphicsPixmapItem mTitle2;
    QGraphicsPixmapItem mEndBackground;//结束界面背景
    QGraphicsPixmapItem mEndRect;//结束界面黑色矩形底框
    QGraphicsPixmapItem mRank;//评级
    QGraphicsPixmapItem mStopRect;//暂停界面黑色矩形底框
    QGraphicsPixmapItem mStopBackground;//暂停界面背景

    //QVideoWidget gif1;
    //QGraphicsVideoItem gif2;
    //QMediaPlayer Gifplayer1;


    QGraphicsTextItem *mPoints;//分数
    QGraphicsTextItem *mAcc;//准度
    QGraphicsTextItem *mLv;//谱面难度
    QGraphicsTextItem *mPName;//谱面名字
    QGraphicsTextItem *mCombo = new QGraphicsTextItem("Combo");
    QGraphicsTextItem *mComboNum;//连击数
    QGraphicsTextItem *mStatus;//Perfect Good Bad Miss
    QGraphicsTextItem *mEndName;//结束界面谱面名字
    QGraphicsTextItem *mScore;
    QGraphicsTextItem *mMaxCombo = new QGraphicsTextItem("MaxCombo:");//最大连击数
    QGraphicsTextItem *mMaxComboNum;
    QGraphicsTextItem *mAccuracy = new QGraphicsTextItem("Accuracy:");//准度
    QGraphicsTextItem *mAccuracyNum;
    QGraphicsTextItem *mPerfect = new QGraphicsTextItem("Perfect:");
    QGraphicsTextItem *mPerfectNum;
    QGraphicsTextItem *mGood = new QGraphicsTextItem("Good:");
    QGraphicsTextItem *mGoodNum;
    QGraphicsTextItem *mBad = new QGraphicsTextItem("Bad:");
    QGraphicsTextItem *mBadNum;
    QGraphicsTextItem *mMiss = new QGraphicsTextItem("Miss:");
    QGraphicsTextItem *mMissNum;
    QGraphicsTextItem *mStopCountdown;//暂停倒计时
    QGraphicsTextItem *mStopText;
    QGraphicsTextItem *mContinueText;
    QGraphicsTextItem *mQuitText;

    //按钮
    QPushButton *mTitle3;//开始界面按钮
    QPushButton *stop;//暂停按钮
    QPushButton *Continue;//继续按钮


    //计时器
    QTimer *mMSTimer;//谱面移动计时器
    QTimer *mDelay;//开始前缓冲计时器
    QTimer *mDetectKeyTimer;//检测按键计时器(包括边界判定)
    QTimer *BGMDelay;//BGM缓冲计时器
    QTimer *MSDelay;//结算界面计时器
    QTimer *MusicTimer;//音乐时间计时器
    QTimer *stopDelay;//暂停延时计时器

    //效果
    QGraphicsBlurEffect *mBGBlurEffect;//主界面背景模糊效果
    QGraphicsBlurEffect *mSBGBlurEffect;//暂停界面背景模糊效果
    QGraphicsBlurEffect *mEBGBlurEffect;//结算界面背景模糊效果
    QGraphicsOpacityEffect *mBGOpacityEffect;//主界面背景透明效果
    QGraphicsOpacityEffect *mSBGOpacityEffect;//暂停界面背景透明效果
    QGraphicsOpacityEffect *mStopRectBGOpacityEffect;//暂停界面矩形背景透明效果
    QGraphicsOpacityEffect *mEBGOpacityEffect;//结算界面背景透明效果

    //音乐播放器
    QMediaPlayer* EndBGMPlayer;
    QAudioOutput* EndBGMOutput;
};

#endif // GAMECONTROL_H
